<template>
  <div>
    <img src="../../assets/img/screen.jpg" alt="" />
    <p>clientX: 鼠标相对于浏览器有效区域X轴的位置</p>
    <p>
      offsetHeight :元素（border-box）的高度 ，也就是标准盒模型
      不包含margin的高度
    </p>
    <p>
      offsetLeft：返回当前元素左上角相对于 HTMLElement.offsetParent
      节点的左边界偏移的像素值
    </p>
    <p>offsetX 相对于触发事件元素的左上顶点相对位置</p>
    <p>which 左键返回1，右键返回3，中键返回2，侧键不一定，从4开始</p>
  </div>
  <pre>
    <code>
      el：指令所绑定的元素，可以用来直接操作 DOM。
      binding：一个对象，包含以下属性：
      name：指令名，不包括 v- 前缀。
      value：指令的绑定值，例如：v-my-directive=“1 + 1” 中，绑定值为 2。
      oldValue：指令绑定的前一个值，仅在 update 和
      componentUpdated 钩子中可用。无论值是否改变都可用。
      expression：字符串形式的指令表达式。例如 v-my-directive=“1 + 1” 中，表达式为 “1 + 1”。
      arg：传给指令的参数，可选。例如 v-my-directive:foo 中，参数为 “foo”。
      modifiers：一个包含修饰符的对象。例如：v-my-directive.foo.bar 中，修饰符对象为 { foo: true, bar: true }。
      vnode：Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
      oldVnode：上一个虚拟节点，仅在 update 和 componentUpdated 钩子中可用。
      除了 el 之外，其它参数都应该是只读的，切勿进行修改。如果需要在钩子之间共享数据，建议通过元素的 dataset 来进行。
    </code>
  </pre>

</template>
<script lang="ts" setup>
import Drag from "./drag_move.vue";
import { ref, reactive, Directive, DirectiveBinding } from "vue";


const vDrag: Directive = (el: HTMLElement, binding: DirectiveBinding) => {
  const moveElement: HTMLDivElement = el.firstElementChild as HTMLDivElement;
  const mouseDown = (e: MouseEvent) => {
    //   触发元素不是header 则不执行
    if (moveElement === e.target) {
      const x = e.clientX - el.offsetLeft;
      const y = e.clientY - el.offsetTop;
      const move = (e: MouseEvent) => {
        el.style.left = e.clientX - x + "px";
        el.style.top = e.clientY - y + "px";
      };
      //鼠标移动
      document.addEventListener("mousemove", move);
      //鼠标抬起
      document.addEventListener("mouseup", (e: MouseEvent) => {
        //   边界处理
        if (el.offsetTop < 0) {
          el.style.top = 0 + "px";
        }
        if (e.clientX - x < 0) {
          el.style.left = 0 + "px";
        }
        if (e.clientY - y + el.offsetHeight >= window.innerHeight) {
          el.style.top = window.innerHeight - el.offsetHeight + "px";
        }
        if (e.clientX - x + el.offsetWidth >= window.innerWidth) {
          el.style.left = window.innerWidth - el.offsetWidth + "px";
        }

        document.removeEventListener("mousemove", move);
      });
    }
  };
  //鼠标按下
  document.addEventListener("mousedown", mouseDown);
};
</script>
<style lang="less" scoped></style>
